/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.credsoft.copcred.model.vo;

import br.com.credsoft.copcred.model.vo.enumeration.EnderecoCorrespondencia;
import br.com.credsoft.copcred.model.vo.enumeration.EstadoCivil;
import br.com.credsoft.copcred.model.vo.enumeration.Sexo;
import br.com.credsoft.copcred.model.vo.enumeration.UnidadeFederativa;
import br.gov.caixa.gisutsa.framework.tapiocaframework.persistencia.AbstractEntity;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

/**
 *
 * @author Sales
 * @since 2009-05-31
 */
@Entity
@Table(name = "cliente")
public class Cliente extends AbstractEntity {

    private static final long serialVersionUID = -6952703204971700511L;
    private Long id;
    private int versao;
    private Empresa empresa;
    private String nome;
    private String cpf;
    private Sexo sexo;
    private String naturalidade;
    private Calendar dataNascimento;
    private String rgNumero;
    private String rgOrgao;
    private UnidadeFederativa rgUf;
    private Calendar rgDataExpedicao;
    private String nomePai;
    private String nomeMae;
    private EstadoCivil estadoCivil;
    private String nomeConjuge;
    private EnderecoCorrespondencia enderecoCorrespondencia;
    private String ruaResidencial;
    private Integer numeroResidencial;
    private String complementoResidencial;
    private String bairroResidencial;
    private String cepResidencial;
    private String cidadeResidencial;
    private UnidadeFederativa ufResidencial;
    private String pontoReferenciaResidencial;
    private String ruaComercial;
    private Integer numeroComercial;
    private String complementoComercial;
    private String bairroComercial;
    private String cepComercial;
    private String cidadeComercial;
    private UnidadeFederativa ufComercial;
    private String pontoReferenciaComercial;
    private String telefone1;
    private String telefone2;
    private String telefone3;
    private String email;
    private Double salario;
    private List<ContaCliente> contas;
    private List<Proposta> propostas;

    public Cliente() {
        this.enderecoCorrespondencia = EnderecoCorrespondencia.R;
        this.propostas = new LinkedList<Proposta>();
        this.contas = new LinkedList<ContaCliente>();
    }

    public Cliente(Long id) {
        this();
        this.id = id;
    }

    public Cliente(Long id, String nome, String cpf, Sexo sexo, String naturalidade, Calendar dataNascimento, String rgNumero, String rgOrgao, UnidadeFederativa rgUf, Calendar rgDataExpedicao, String nomePai, String nomeMae, EstadoCivil estadoCivil, String nomeConjuge, EnderecoCorrespondencia enderecoCorrespondencia, String ruaResidencial, Integer numeroResidencial, String complementoResidencial, String bairroResidencial, String cepResidencial, String cidadeResidencial, UnidadeFederativa ufResidencial, String pontoReferenciaResidencial, String ruaComercial, Integer numeroComercial, String complementoComercial, String bairroComercial, String cepComercial, String cidadeComercial, UnidadeFederativa ufComercial, String pontoReferenciaComercial, String telefone1, String telefone2, String telefone3, String email, Double salario) {
        this.id = id;
        this.nome = nome;
        this.cpf = cpf;
        this.sexo = sexo;
        this.naturalidade = naturalidade;
        this.dataNascimento = dataNascimento;
        this.rgNumero = rgNumero;
        this.rgOrgao = rgOrgao;
        this.rgUf = rgUf;
        this.rgDataExpedicao = rgDataExpedicao;
        this.nomePai = nomePai;
        this.nomeMae = nomeMae;
        this.estadoCivil = estadoCivil;
        this.nomeConjuge = nomeConjuge;
        this.enderecoCorrespondencia = enderecoCorrespondencia;
        this.ruaResidencial = ruaResidencial;
        this.numeroResidencial = numeroResidencial;
        this.complementoResidencial = complementoResidencial;
        this.bairroResidencial = bairroResidencial;
        this.cepResidencial = cepResidencial;
        this.cidadeResidencial = cidadeResidencial;
        this.ufResidencial = ufResidencial;
        this.pontoReferenciaResidencial = pontoReferenciaResidencial;
        this.ruaComercial = ruaComercial;
        this.numeroComercial = numeroComercial;
        this.complementoComercial = complementoComercial;
        this.bairroComercial = bairroComercial;
        this.cepComercial = cepComercial;
        this.cidadeComercial = cidadeComercial;
        this.ufComercial = ufComercial;
        this.pontoReferenciaComercial = pontoReferenciaComercial;
        this.telefone1 = telefone1;
        this.telefone2 = telefone2;
        this.telefone3 = telefone3;
        this.email = email;
        this.salario = salario;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cliente_id", nullable = false)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Version
    @Column(name = "versao", nullable = false)
    public int getVersao() {
        return versao;
    }

    public void setVersao(int versao) {
        this.versao = versao;
    }

    @ManyToOne(targetEntity = Empresa.class)
    @JoinColumn(name = "empresa_id", nullable = false)
    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    @Column(name = "nome", nullable = false, length = 40)
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Column(name = "cpf", nullable = false, length = 11)
    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    @Enumerated(EnumType.STRING)
    @Column(name = "sexo", nullable = false, length = 1)
    public Sexo getSexo() {
        return sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    @Column(name = "naturalidade", nullable = false, length = 50)
    public String getNaturalidade() {
        return naturalidade;
    }

    public void setNaturalidade(String naturalidade) {
        this.naturalidade = naturalidade;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "data_nascimento", nullable = false)
    public Calendar getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Calendar dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    @Column(name = "rg_numero", nullable = false, length = 40)
    public String getRgNumero() {
        return rgNumero;
    }

    public void setRgNumero(String rgNumero) {
        this.rgNumero = rgNumero;
    }

    @Column(name = "rg_orgao", nullable = false, length = 20)
    public String getRgOrgao() {
        return rgOrgao;
    }

    public void setRgOrgao(String rgOrgao) {
        this.rgOrgao = rgOrgao;
    }

    @Enumerated(EnumType.STRING)
    @Column(name = "rg_uf", nullable = false, length = 2)
    public UnidadeFederativa getRgUf() {
        return rgUf;
    }

    public void setRgUf(UnidadeFederativa rgUf) {
        this.rgUf = rgUf;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "rg_expedicao", nullable = false)
    public Calendar getRgDataExpedicao() {
        return rgDataExpedicao;
    }

    public void setRgDataExpedicao(Calendar rgDataExpedicao) {
        this.rgDataExpedicao = rgDataExpedicao;
    }

    @Column(name = "nome_mae", nullable = false, length = 40)
    public String getNomeMae() {
        return nomeMae;
    }

    public void setNomeMae(String nomeMae) {
        this.nomeMae = nomeMae;
    }

    @Column(name = "nome_pai", nullable = true, length = 40)
    public String getNomePai() {
        return nomePai;
    }

    public void setNomePai(String nomePai) {
        this.nomePai = nomePai;
    }

    @Enumerated(EnumType.STRING)
    @Column(name = "estado_civil", nullable = false, length = 10)
    public EstadoCivil getEstadoCivil() {
        return estadoCivil;
    }

    public void setEstadoCivil(EstadoCivil estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    @Column(name = "nome_conjuge", nullable = true, length = 40)
    public String getNomeConjuge() {
        return nomeConjuge;
    }

    public void setNomeConjuge(String nomeConjuge) {
        this.nomeConjuge = nomeConjuge;
    }

    @Enumerated(EnumType.STRING)
    @Column(name = "endereco_correspondencia", nullable = false, length = 1, columnDefinition = "char(1) default 'R'")
    public EnderecoCorrespondencia getEnderecoCorrespondencia() {
        return enderecoCorrespondencia;
    }

    public void setEnderecoCorrespondencia(EnderecoCorrespondencia enderecoCorrespondencia) {
        this.enderecoCorrespondencia = enderecoCorrespondencia;
    }

    @Column(name = "residencia_rua", nullable = false, length = 50)
    public String getRuaResidencial() {
        return ruaResidencial;
    }

    public void setRuaResidencial(String ruaResidencial) {
        this.ruaResidencial = ruaResidencial;
    }

    @Column(name = "residencia_numero", nullable = false)
    public Integer getNumeroResidencial() {
        return numeroResidencial;
    }

    public void setNumeroResidencial(Integer numeroResidencial) {
        this.numeroResidencial = numeroResidencial;
    }

    @Column(name = "residencia_complemento", nullable = true, length = 30)
    public String getComplementoResidencial() {
        return complementoResidencial;
    }

    public void setComplementoResidencial(String complementoResidencial) {
        this.complementoResidencial = complementoResidencial;
    }

    @Column(name = "residencia_bairro", nullable = false, length = 30)
    public String getBairroResidencial() {
        return bairroResidencial;
    }

    public void setBairroResidencial(String bairroResidencial) {
        this.bairroResidencial = bairroResidencial;
    }

    @Column(name = "residencia_cep", nullable = false, length = 8)
    public String getCepResidencial() {
        return cepResidencial;
    }

    public void setCepResidencial(String cepResidencial) {
        this.cepResidencial = cepResidencial;
    }

    @Column(name = "residencia_cidade", nullable = false, length = 30)
    public String getCidadeResidencial() {
        return cidadeResidencial;
    }

    public void setCidadeResidencial(String cidadeResidencial) {
        this.cidadeResidencial = cidadeResidencial;
    }

    @Enumerated(EnumType.STRING)
    @Column(name = "residencia_uf", nullable = false, length = 2)
    public UnidadeFederativa getUfResidencial() {
        return ufResidencial;
    }

    public void setUfResidencial(UnidadeFederativa ufResidencial) {
        this.ufResidencial = ufResidencial;
    }

    @Column(name = "residencia_referencia", nullable = true, length = 80)
    public String getPontoReferenciaResidencial() {
        return pontoReferenciaResidencial;
    }

    public void setPontoReferenciaResidencial(String pontoReferenciaResidencial) {
        this.pontoReferenciaResidencial = pontoReferenciaResidencial;
    }

    @Column(name = "comercial_rua", nullable = true, length = 50)
    public String getRuaComercial() {
        return ruaComercial;
    }

    public void setRuaComercial(String ruaComercial) {
        this.ruaComercial = ruaComercial;
    }

    @Column(name = "comercial_numero", nullable = true)
    public Integer getNumeroComercial() {
        return numeroComercial;
    }

    public void setNumeroComercial(Integer numeroComercial) {
        this.numeroComercial = numeroComercial;
    }

    @Column(name = "comercial_complemento", nullable = true, length = 30)
    public String getComplementoComercial() {
        return complementoComercial;
    }

    public void setComplementoComercial(String complementoComercial) {
        this.complementoComercial = complementoComercial;
    }

    @Column(name = "comercial_bairro", nullable = true, length = 30)
    public String getBairroComercial() {
        return bairroComercial;
    }

    public void setBairroComercial(String bairroComercial) {
        this.bairroComercial = bairroComercial;
    }

    @Column(name = "comercial_cep", nullable = true, length = 8)
    public String getCepComercial() {
        return cepComercial;
    }

    public void setCepComercial(String cepComercial) {
        this.cepComercial = cepComercial;
    }

    @Column(name = "comercial_cidade", nullable = true, length = 30)
    public String getCidadeComercial() {
        return cidadeComercial;
    }

    public void setCidadeComercial(String cidadeComercial) {
        this.cidadeComercial = cidadeComercial;
    }

    @Enumerated(EnumType.STRING)
    @Column(name = "comercial_uf", nullable = true, length = 2)
    public UnidadeFederativa getUfComercial() {
        return ufComercial;
    }

    public void setUfComercial(UnidadeFederativa ufComercial) {
        this.ufComercial = ufComercial;
    }

    @Column(name = "comercial_referencia", nullable = true, length = 80)
    public String getPontoReferenciaComercial() {
        return pontoReferenciaComercial;
    }

    public void setPontoReferenciaComercial(String pontoReferenciaComercial) {
        this.pontoReferenciaComercial = pontoReferenciaComercial;
    }

    @Column(name = "telefone_1", nullable = false, length = 10)
    public String getTelefone1() {
        return telefone1;
    }

    public void setTelefone1(String telefone1) {
        this.telefone1 = telefone1;
    }

    @Column(name = "telefone_2", nullable = true, length = 10)
    public String getTelefone2() {
        return telefone2;
    }

    public void setTelefone2(String telefone2) {
        this.telefone2 = telefone2;
    }

    @Column(name = "telefone_3", nullable = true, length = 10)
    public String getTelefone3() {
        return telefone3;
    }

    public void setTelefone3(String telefone3) {
        this.telefone3 = telefone3;
    }

    @Column(name = "email", nullable = true, length = 50)
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column(name = "salario", nullable = false, length = 50, scale = 2, precision = 10)
    public Double getSalario() {
        return salario;
    }

    public void setSalario(Double salario) {
        this.salario = salario;
    }

    @OneToMany(targetEntity = ContaCliente.class, mappedBy = "cliente")
    public List<ContaCliente> getContas() {
        return contas;
    }

    public void setContas(List<ContaCliente> contas) {
        this.contas = contas;
    }

    @OneToMany(targetEntity = Proposta.class, mappedBy = "cliente")
    public List<Proposta> getPropostas() {
        return propostas;
    }

    public void setPropostas(List<Proposta> propostas) {
        this.propostas = propostas;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Cliente other = (Cliente) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 29 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }

    public void addProposta(Proposta proposta) {
        this.propostas.add(proposta);
    }

    public void removeProposta(Proposta proposta) {
        this.propostas.remove(proposta);
    }

    public void addConta(ContaCliente conta) {
        this.contas.add(conta);
    }

    public void removeConta(ContaCliente conta) {
        this.contas.remove(conta);
    }
}
